/*
 * assert_utilits.h
 *
 *  Created on: 2016年2月3日
 *      Author: 10km
 */

#ifndef COMMON_SOURCE_CPP_ASSERT_MACROS_H_
#define COMMON_SOURCE_CPP_ASSERT_MACROS_H_

#include <stdexcept>
#include <string>

 /**
  * @brief 将传入的参数转换为字符串。
  *
  * 使用了两个宏定义以确保宏参数被正确转换为字符串。
  * _DEF_STRING 直接进行字符串化，而 DEF_TO_STRING 会先进行宏替换操作。
  */
#define _DEF_STRING(x) #x
#define DEF_TO_STRING(x) _DEF_STRING(x)

  /**
   * @brief 用于错误信息定位的宏。
   *
   * SOURCE_AT 会生成当前文件名和行号的信息，用于构造更加详细的错误消息。
   */
#define SOURCE_AT __FILE__ ":" DEF_TO_STRING(__LINE__)

   /**
	* @brief 构造错误信息字符串。
	*
	* 将位置信息与自定义的错误消息连接起来生成完整的错误信息。
	* @param msg 自定义的错误信息。
	*/
#define ERROR_STR(msg) std::string(SOURCE_AT ":").append(msg)

	/**
	 * @brief 根据表达式的真值抛出异常。
	 *
	 * 如果指定的表达式为假，则抛出指定类型的异常。
	 * @param except 要抛出的异常类型。
	 * @param expression 要检查的逻辑表达式。
	 */
#define throw_except_if_false(except,expression) \
	if(!(expression))\
		throw except();

	 /**
	  * @brief 根据表达式的真值抛出异常，并带有错误信息。
	  *
	  * 如果表达式为真，抛出带有指定错误信息的异常。
	  * @param except 要抛出的异常类型。
	  * @param expression 要检查的逻辑表达式。
	  * @param msg 要附加的错误信息字符串。
	  */
#define throw_except_if_msg(except,expression,msg) \
	if(expression)\
		throw except(ERROR_STR(msg));

	  /**
	   * @brief 根据表达式的真值抛出异常，并附带表达式作为信息。
	   *
	   * 如果表达式为真，抛出带有表达式字符串化后的异常信息。
	   * @param except 要抛出的异常类型。
	   * @param expression 要检查的逻辑表达式。
	   */
#define throw_except_if(except,expression) throw_except_if_msg(except,expression,#expression)

	   /**
		* @brief 如果表达式为真，则抛出std::invalid_argument异常，并附带自定义错误信息。
		*
		* @param expression 要检查的逻辑表达式。
		* @param msg 要附加的错误信息。
		*/
#define throw_if_msg(expression,msg) throw_except_if_msg(std::invalid_argument,expression,msg)

		/**
		 * @brief 如果表达式为真，则抛出std::invalid_argument异常。
		 *
		 * 如果表达式的值为真，抛出的异常将附带表达式本身作为错误信息。
		 * @param expression 要检查的逻辑表达式。
		 */
#define throw_if(expression) throw_except_if(std::invalid_argument,expression)

		 /**
		  * @brief 如果给定指针为空，抛出异常并附带错误信息。
		  *
		  * @param except 要抛出的异常类型。
		  * @param p 被检查的指针。
		  */
#define throw_except_if_null(except,p) throw_except_if_msg(except,nullptr==(p),#p" is null")

		  /**
		   * @brief 如果给定指针为空，抛出std::invalid_argument异常，并附带错误信息。
		   *
		   * 如果指针为空，错误信息将包含指针表达式。
		   * @param p 被检查的指针。
		   */
#define throw_if_null(p) throw_if_msg(nullptr==(p),#p" is null")

#endif /* COMMON_SOURCE_CPP_ASSERT_MACROS_H_ */





///*
// * assert_utilits.h
// *
// *  Created on: 2016年2月3日
// *      Author: 10km
// */
//
//#ifndef COMMON_SOURCE_CPP_ASSERT_MACROS_H_
//#define COMMON_SOURCE_CPP_ASSERT_MACROS_H_
//#include <stdexcept>
//#include <string>
//#define _DEF_STRING(x) #x
//#define DEF_TO_STRING(x) _DEF_STRING(x)
//#define SOURCE_AT __FILE__ ":" DEF_TO_STRING(__LINE__)
//#define ERROR_STR(msg) std::string(SOURCE_AT ":").append(msg)
//
//#define throw_except_if_false(except,expression) \
//	if(!expression)\
//		throw except();
//
//#define throw_except_if_msg(except,expression,msg) \
//	if(expression)\
//		throw except(ERROR_STR(msg));
//#define throw_except_if(except,expression) throw_except_if_msg(except,expression,#expression)
//#define throw_if_msg(expression,msg) throw_except_if_msg(std::invalid_argument,expression,msg)
//#define throw_if(expression) throw_except_if(std::invalid_argument,expression)
//#define throw_except_if_null(except,p) throw_except_if_msg(except,nullptr==p,#p" is null")
//#define throw_if_null(p) throw_if_msg(nullptr==p,#p" is null")
//
//#endif /* COMMON_SOURCE_CPP_ASSERT_MACROS_H_ */
